#ifndef HISTORYLIST_H
#define HISTORYLIST_H

#include <string>
#include <map>
#include <QFile>
#include <QObject>
#include <QByteArray>
#include <algorithm>
#include "parser.h"
#include <QDebug>

class HistoryTree
{
    QString str;
    std::map<QChar, HistoryTree*> history_tree;
    std::map<QChar, HistoryTree*>::value_type __deleteNode(std::map<QChar, HistoryTree*>::value_type);
public:
    HistoryTree(const QString &s)
        : str(s) {}
    HistoryTree() {}
    ~HistoryTree();
    std::map<QChar, HistoryTree*> &getHistoryTree() { return history_tree; }
    void setStr(QString s) { str = s; }
    const QString &getStr() const { return str; }
};

class HeadHistoryTree
{
    std::map<QChar, HistoryTree*> users_history_tree; // історія входу в систему (поле користувач)
    std::map<QChar, HistoryTree*> hosts_history_tree; // історія входу в систему (поле ip-адрес)
    std::map<QChar, HistoryTree*> search_history_tree; // історія пошуку користувачів
    QFile history_file; // файл history - містить історію вводу. Створюється автоматично програмою
    Grammar grammar; // граматика файла історії history
    std::map<QString, int> new_users; // дані, які вводилися в поле "логін" в поточному сеансі
    std::map<QString, int> new_hosts; // дані, які вводилися в поле "ip-адрес" в поточному сеансі
    std::map<QString, std::map<QString, int> > history_file_data; // буфер даних файла історії history. Заповнюється ф-цією parser()
    QStringList sections_name_list;
    void __initHistoryTree(const std::map<QString, int>&, std::map<QChar, HistoryTree*>&){}
    void __modifyHistoryTree(const QString&, std::map<QChar, HistoryTree*>&){} // будує дерево для швидкого пошуку потрібного
                                                                             // слова із раніше введених користувачем
    void  __searchingHistoryTree(HistoryTree*, QStringList*){}
public:
    HeadHistoryTree(){}
    ~HeadHistoryTree(){}
    QStringList *getHistoryTree(const QString&, const QString&){}
    void addUsersData(const QString &str) // добавляємо введені в поточному сеансі дані в формі "логін"
    {
        if (!new_users[str] && !history_file_data[sections_name_list[0]][str]) // даний логін ще не вводився
        {
            new_users[str] = 1;
            __modifyHistoryTree(str, users_history_tree);
        }
    }
    void addHostsData(const QString &str) // добавляємо введені в поточному сеансі дані в формі "ip-адрес"
    {
        if (!new_hosts[str] && !history_file_data[sections_name_list[1]][str]) // даний адрес хоста ще не вводився
        {
            new_hosts[str] = 1;
            __modifyHistoryTree(str, hosts_history_tree);
        }
    }
};

#endif // HISTORYLIST_H
